﻿//using AntDesign;
//using AntDesign.TableModels;
//using JetBrains.Annotations;
//using Localization.Resources.AbpUi;
//using Microsoft.AspNetCore.Authorization;
//using Microsoft.AspNetCore.Components;
//using Microsoft.Extensions.Localization;
//using System;
//using System.Collections.Concurrent;
//using System.Collections.Generic;
//using System.Linq;
//using System.Reflection;
//using System.Runtime.CompilerServices;
//using System.Threading.Tasks;
//using Volo.Abp.Application.Dtos;
//using Volo.Abp.AspNetCore.Components;
//using Volo.Abp.AspNetCore.Components.Web.Extensibility.EntityActions;
//using Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns;
//using Volo.Abp.BlazoriseUI.Components.ObjectExtending;
//using Volo.Abp.Localization;
//using Volo.Abp.ObjectExtending;
//using Volo.Abp.ObjectExtending.Modularity;
//using Xms.Abp.Application.Dtos;
//using Xms.Abp.Application.Services;
//using Xms.Abp.Authorization;
//using Xms.Abp.Data;
//using Xms.Abp.ObjectMapping;

//namespace Xms.Abp.AntDesignUI
//{
//    public partial class XmsCrudPage<TAppService, TEntityDto, TKey>
//        : XmsCrudPage<TAppService, TEntityDto, TKey, PagedSortedAndFilterParameter>
//        where TAppService : IXmsCrudAppService<TEntityDto, TKey>
//        where TEntityDto : class, IEntityDto<TKey>, new()
//    {
//    }

//    public partial class XmsCrudPage<TAppService, TEntityDto, TKey, TPagedParameter>
//        : XmsCrudPage<TAppService, TEntityDto, TKey, TPagedParameter, TEntityDto>
//        where TAppService : IXmsCrudAppService<TEntityDto, TKey, TPagedParameter>
//        where TEntityDto : class, IEntityDto<TKey>, new()
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//    {
//    }

//    public partial class XmsCrudPage<TAppService, TEntityDto, TKey, TPagedParameter, TCreateParameter>
//        : XmsCrudPage<TAppService, TEntityDto, TKey, TPagedParameter, TCreateParameter, TCreateParameter>
//        where TAppService : IXmsCrudAppService<TEntityDto, TKey, TPagedParameter, TCreateParameter>
//        where TEntityDto : class, IEntityDto<TKey>, new()
//        where TCreateParameter : class, new()
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//    {
//    }

//    public partial class XmsCrudPage<TAppService, TEntityDto, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        : XmsCrudPage<TAppService, TEntityDto, TEntityDto, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        where TAppService : IXmsCrudAppService<TEntityDto, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        where TEntityDto : class, IEntityDto<TKey>, new()
//        where TCreateParameter : class, new()
//        where TUpdateParameter : class, new()
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//    {
//    }

//    public partial class XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        : XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter, TPagingListResult, TDetailsResult, TCreateParameter, TUpdateParameter>
//        where TAppService : IXmsCrudAppService<TDetailsResult, TPagingListResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        where TDetailsResult : class, IEntityDto<TKey>, new()
//        where TPagingListResult : IEntityDto<TKey>
//        where TCreateParameter : class, new()
//        where TUpdateParameter : class, new()
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//    {
//    }

//    public partial class XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter, TListViewModel, TDetailsViewModel, TCreateViewModel, TUpdateViewModel>
//        : XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TDetailsResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter, TListViewModel, TDetailsViewModel, TCreateViewModel, TUpdateViewModel>
//        where TAppService : IXmsCrudAppService<TDetailsResult, TPagingListResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        where TDetailsResult : IEntityDto<TKey>
//        where TPagingListResult : IEntityDto<TKey>
//        where TCreateParameter : class
//        where TUpdateParameter : class
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//        where TListViewModel : IEntityDto<TKey>
//        where TDetailsViewModel : class, IEntityDto<TKey>, new()
//        where TCreateViewModel : class, new()
//        where TUpdateViewModel : class, new()
//    {

//    }

//    public partial class XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TExportResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter, TListViewModel, TDetailsViewModel, TCreateViewModel, TUpdateViewModel>
//        : XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TExportResult, TExportResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter, TListViewModel, TDetailsViewModel, TCreateViewModel, TUpdateViewModel>
//        where TAppService : IXmsCrudAppService<TDetailsResult, TPagingListResult, TExportResult, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        where TDetailsResult : IEntityDto<TKey>
//        where TPagingListResult : IEntityDto<TKey>
//        where TCreateParameter : class
//        where TUpdateParameter : class
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//        where TListViewModel : IEntityDto<TKey>
//        where TDetailsViewModel : class, IEntityDto<TKey>, new()
//        where TCreateViewModel : class, new()
//        where TUpdateViewModel : class, new()
//    {

//    }

//    public partial class XmsCrudPage<TAppService, TDetailsResult, TPagingListResult, TExportResult, TImportParameter, TKey, TPagedParameter, TCreateParameter, TUpdateParameter, TListViewModel, TDetailsViewModel, TCreateViewModel, TUpdateViewModel>
//        : AbpComponentBase
//        where TAppService : IXmsCrudAppService<TDetailsResult, TPagingListResult, TExportResult, TImportParameter, TKey, TPagedParameter, TCreateParameter, TUpdateParameter>
//        where TDetailsResult : IEntityDto<TKey>
//        where TPagingListResult : IEntityDto<TKey>
//        where TCreateParameter : class
//        where TUpdateParameter : class
//        where TPagedParameter : class, IPagedSortedAndFilterParameter, new()
//        where TListViewModel : IEntityDto<TKey>
//        where TDetailsViewModel : class, IEntityDto<TKey>, new()
//        where TCreateViewModel : class, new()
//        where TUpdateViewModel : class, new()
//    {
//        [Inject] protected TAppService AppService { get; set; }
//        [Inject] protected IStringLocalizer<AbpUiResource> UiLocalizer { get; set; }

//        [Parameter] public int PageSize { get; set; } = 20;
//        [Parameter] public string[] RowMoreActions { get; set; }
//        [Parameter] public string[] ToolbarMoreActions { get; set; }
//        [Parameter] public bool Detailsable { get; set; } = true;
//        [Parameter] public bool Creatable { get; set; } = true;
//        [Parameter] public bool Editable { get; set; } = true;
//        [Parameter] public bool Deletable { get; set; } = true;
//        [Parameter] public bool DeleteManyable { get; set; } = false;
//        [Parameter] public bool Exportable { get; set; } = false;
//        [Parameter] public bool Importable { get; set; } = false;
//        [Parameter] public bool ToggleEabledManyable { get; set; } = false;
//        [Parameter] public ShowPageModel ShowPageModel { get; set; } = ShowPageModel.Drawer;
//        [Parameter] public RenderFragment<TListViewModel> AllColumnsTempate { get; set; }
//        [Parameter] public RenderFragment<TListViewModel> ColumnsTempate { get; set; }
//        [Parameter] public RenderFragment<TListViewModel> ActionColumnTempate { get; set; }
//        [Parameter] public RenderFragment SearchTempate { get; set; }
//        [Parameter] public RenderFragment ToolbarTempate { get; set; }

//        protected int CurrentPageIndex = 1;
//        protected int CurrentPageSize = 1;
//        protected string CurrentSorting;
//        protected int TotalCount;
//        protected bool PagingLoading = true;
//        protected TPagedParameter PagedParameter = new();
//        protected TDetailsViewModel DetailsEntity;
//        protected TCreateViewModel NewEntity;
//        protected TKey EditingEntityId;
//        protected TKey DeletingEntityId;
//        protected TKey[] BulkIds;
//        protected TUpdateViewModel EditingEntity;
//        protected Table<TListViewModel> TableRef;
//        protected Space ActionColumnRef;
//        protected Pagination PaginationRef;
//        protected List<TListViewModel> CurrentDataSource = new List<TListViewModel>();
//        protected List<BreadcrumbItem> BreadcrumbItems = new(5);

//        protected new IXmsObjectMapper ObjectMapper => base.ObjectMapper as IXmsObjectMapper;

//        protected static ConcurrentDictionary<Type, TableColumnInfo[]> TypesColumns = new();
//        protected TableColumnInfo[] GetTableColumnInfos()
//        {
//            return TypesColumns.GetOrAdd(typeof(TListViewModel), XmsUIHelper.GetTableColumnInfos<TListViewModel>());
//        }

//        protected new IXmsAuthorizationService AuthorizationService => base.AuthorizationService as IXmsAuthorizationService;

//        #region Policy
//        protected virtual string DetailsPolicyName => GetPolicy();
//        protected virtual string CreatePolicyName => GetPolicy();
//        protected virtual string UpdatePolicyName => GetPolicy();
//        protected virtual string DeletePolicyName => GetPolicy();
//        protected virtual string DeleteManyPolicyName => GetPolicy();
//        protected virtual string ToggleEnablePolicyName => GetPolicy();
//        protected virtual string ExportPolicyName => GetPolicy();
//        protected virtual string ImportPolicyName => GetPolicy();

//        public bool HasDetailsPermission => HasPermission(DetailsPolicyName);
//        public bool HasCreatePermission => HasPermission(CreatePolicyName);
//        public bool HasUpdatePermission => HasPermission(UpdatePolicyName);
//        public bool HasDeletePermission => HasPermission(DeletePolicyName);
//        public bool HasDeleteManyPermission => HasPermission(DeleteManyPolicyName);
//        public bool HasToggleEnablePermission => HasPermission(ToggleEnablePolicyName);
//        public bool HasExportPermission => HasPermission(ExportPolicyName);
//        public bool HasImportPermission => HasPermission(ImportPolicyName);
//        public bool HasPermission(string policyName)
//        {
//            if (policyName == null)
//            {
//                return true;
//            }
//            return GrantedPolicyNames.Contains(policyName);
//        }
//        protected virtual async Task SetPermissionsAsync()
//        {
//            GrantedPolicyNames.AddRange(await AuthorizationService.FilterGrantedAsync(Policies.Values));
//        }

//        protected virtual Dictionary<string, string> Policies { get; }
//        protected virtual List<string> GrantedPolicyNames { get; }

//        protected virtual string GetPolicy([CallerMemberName] string memberName = null)
//        {
//            memberName = memberName.RemovePostFix("PolicyName").RemovePostFix("Async");
//            return Policies.GetOrDefault(memberName);
//        }
//        protected virtual async Task CheckPolicyAsync([CanBeNull] string policyName)
//        {
//            if (string.IsNullOrEmpty(policyName))
//            {
//                return;
//            }

//            await AuthorizationService.CheckAsync(policyName);
//        }

//        protected virtual async Task CheckDetailsPolicyAsync()
//        {
//            await CheckPolicyAsync(DetailsPolicyName);
//        }
//        protected virtual async Task CheckCreatePolicyAsync()
//        {
//            await CheckPolicyAsync(CreatePolicyName);
//        }
//        protected virtual async Task CheckUpdatePolicyAsync()
//        {
//            await CheckPolicyAsync(UpdatePolicyName);
//        }
//        protected virtual async Task CheckDeletePolicyAsync()
//        {
//            await CheckPolicyAsync(DeletePolicyName);
//        }
//        protected virtual async Task CheckDeleteManyPolicyAsync()
//        {
//            await CheckPolicyAsync(DeleteManyPolicyName);
//        }
//        protected virtual async Task CheckToggleEnablePolicyAsync()
//        {
//            await CheckPolicyAsync(ToggleEnablePolicyName);
//        }
//        protected virtual async Task CheckExportPolicyAsync()
//        {
//            await CheckPolicyAsync(ExportPolicyName);
//        }
//        protected virtual async Task CheckImportPolicyAsync()
//        {
//            await CheckPolicyAsync(ImportPolicyName);
//        }
//        #endregion

//        protected XmsCrudPage()
//        {
//            DetailsEntity = new();
//            NewEntity = new();
//            EditingEntity = new();
//            GrantedPolicyNames = new();
//            var type = this.GetType();
//            var attr = type.GetCustomAttribute<PermissionsUseAttribute>();
//            if (attr != null)
//            {
//                Policies = PermissionsConst.ToDictionary(attr.PermissionsConstType);
//            }
//            else
//            {
//                Policies = new();
//            }
//            var modelType = typeof(TListViewModel);
//            if (!TypesColumns.ContainsKey(modelType))
//            {
//                TypesColumns.TryAdd(modelType, null);
//            }
//        }

//        protected override async Task OnInitializedAsync()
//        {
//            //TableRef.RowExpandable
//            await SetPermissionsAsync();
//            await SetEntityActionsAsync();
//            await SetTableColumnsAsync();
//            await InvokeAsync(StateHasChanged);
//        }

//        protected override async Task OnAfterRenderAsync(bool firstRender)
//        {
//            if (firstRender)
//            {
//                await base.OnAfterRenderAsync(firstRender);
//                await SetToolbarItemsAsync();
//                await SetBreadcrumbItemsAsync();
//            }
//        }

//        protected virtual async Task GetEntitiesAsync()
//        {
//            try
//            {
//                await UpdateGetListInputAsync();
//                var result = await AppService.GetListAsync(PagedParameter);
//                CurrentDataSource = MapToListViewModel(result.Items);
//                TotalCount = (int)result.TotalCount;
//            }
//            catch (Exception ex)
//            {
//                await HandleErrorAsync(ex);
//            }
//        }

//        private List<TListViewModel> MapToListViewModel(IReadOnlyList<TPagingListResult> dtos)
//        {
//            if (typeof(TPagingListResult) == typeof(TListViewModel))
//            {
//                return dtos.As<List<TListViewModel>>();
//            }

//            return ObjectMapper.MapTo<TListViewModel>(dtos);
//        }

//        protected virtual Task UpdateGetListInputAsync()
//        {
//            if (PagedParameter is ISortedResultRequest sortedResultRequestInput)
//            {
//                sortedResultRequestInput.Sorting = CurrentSorting;
//            }

//            if (PagedParameter is IPagedResultRequest pagedResultRequestInput)
//            {
//                pagedResultRequestInput.SkipCount = (CurrentPageIndex - 1) * PageSize;
//            }

//            if (PagedParameter is ILimitedResultRequest limitedResultRequestInput)
//            {
//                limitedResultRequestInput.MaxResultCount = PageSize;
//            }

//            return Task.CompletedTask;
//        }

//        protected virtual async Task SearchEntitiesAsync()
//        {
//            CurrentPageIndex = 1;

//            await GetEntitiesAsync();

//            await InvokeAsync(StateHasChanged);
//        }

//        protected virtual async Task OnDataGridReadAsync(DataGridReadDataEventArgs<TListViewModel> e)
//        {
//            CurrentSorting = e.Columns
//                .Where(c => c.SortDirection != SortDirection.None)
//                .Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : ""))
//                .JoinAsString(",");
//            CurrentPageIndex = e.Page;

//            await GetEntitiesAsync();

//            await InvokeAsync(StateHasChanged);
//        }

//        protected virtual bool IsSelectionDisabled(TListViewModel model)
//        {
//            return false;
//        }

//        protected virtual Func<RowData<TListViewModel>, bool> IsTableRowExpandable()
//        {
//            return r => r.Data is not IHasChildren<TListViewModel> || r.Data is IHasRemark s && !string.IsNullOrWhiteSpace(s.Remark);
//        }

//        protected Func<PaginationTotalContext, string> PagingShowTotal()
//        {
//            return ctx => $"{ctx.Range.from}-{ctx.Range.to} of {ctx.Total} items";
//        }

//        protected void OnPagingChange(PaginationEventArgs args)
//        {

//        }

//        protected void OnPagingChange(QueryModel<TListViewModel> args)
//        {

//        }

//        protected virtual async Task OnRowMoreActionClickAsync(string action, TListViewModel model)
//        {
//            await Task.CompletedTask;
//        }

//        protected virtual async Task OnToolbarMoreActionClickAsync(string action)
//        {
//            await Task.CompletedTask;
//        }

//        protected virtual async Task OnEditClickAsync(TListViewModel model)
//        {
//            EditingEntityId = model.Id;
//            EditingEntity = ObjectMapper.MapTo<TUpdateViewModel>(model);
//            if (model is IEditingInRow m)
//            {
//                m.IsEditing = true;
//            }
//            else
//            {
//                //TODO:打开编辑界面
//            }
//        }

//        protected virtual async Task OnSaveEditClickAsync(TListViewModel model)
//        {
//            if (model is IEditingInRow m)
//            {
//                var editingEntity = ObjectMapper.MapTo<TUpdateParameter>(model);
//                m.IsSaving = true;
//                try
//                {
//                    await AppService.UpdateAsync(model.Id, editingEntity);
//                    m.IsEditing = false;
//                }
//                finally
//                {
//                    m.IsSaving = false;
//                }
//            }
//        }

//        protected virtual async Task OnCancelEditClickAsync(TListViewModel model)
//        {

//        }

//        protected virtual async Task OnCreateClickAsync()
//        {

//        }

//        protected virtual async Task OnExportClickAsync()
//        {

//        }

//        protected virtual async Task OnImportClickAsync()
//        {

//        }

//        protected virtual async Task OnDownloadTemplateClickAsync()
//        {

//        }

//        protected virtual async Task OnToggleToEnabledClickAsync()
//        {

//        }

//        protected virtual async Task OnToggleToDisabledClickAsync()
//        {

//        }

//        protected virtual async Task OnDeleteManyClickAsync()
//        {

//        }

//        protected virtual async Task OnSearchClickAsync()
//        {

//        }

//        protected virtual async Task OnAdvanceSearchClickAsync()
//        {

//        }

//        protected virtual async Task OnSaveCreateClickAsync(TListViewModel model)
//        {
//            if (model is IEditingInRow m)
//            {
//                m.IsCreating = false;
//            }
//            else
//            {

//            }
//        }

//        protected virtual async Task OnCancelCreateClickAsync(TListViewModel model)
//        {

//        }

//        protected virtual async Task OnDetailsClickAsync(TListViewModel model)
//        {

//        }

//        protected virtual async Task OnDeleteClickAsync(TListViewModel model)
//        {

//        }

//        protected virtual async Task OnEnabledChangedAsync(TListViewModel model, bool isEnabled)
//        {

//        }

//        protected virtual async Task OpenCreateModalAsync()
//        {
//            try
//            {
//                if (CreateValidationsRef != null)
//                {
//                    await CreateValidationsRef.ClearAll();
//                }

//                await CheckCreatePolicyAsync();

//                NewEntity = new TCreateViewModel();

//                // Mapper will not notify Blazor that binded values are changed
//                // so we need to notify it manually by calling StateHasChanged
//                await InvokeAsync(async () =>
//                {
//                    StateHasChanged();
//                    if (CreateModal != null)
//                    {
//                        await CreateModal.Show();
//                    }

//                });
//            }
//            catch (Exception ex)
//            {
//                await HandleErrorAsync(ex);
//            }
//        }

//        protected virtual Task CloseCreateModalAsync()
//        {
//            return InvokeAsync(CreateModal.Hide);
//        }

//        protected virtual void ClosingCreateModal(ModalClosingEventArgs eventArgs)
//        {
//            // cancel close if clicked outside of modal area
//            eventArgs.Cancel = eventArgs.CloseReason == CloseReason.FocusLostClosing;
//        }

//        protected virtual async Task OpenEditModalAsync(TListViewModel entity)
//        {
//            try
//            {
//                if (EditValidationsRef != null)
//                {
//                    await EditValidationsRef.ClearAll();
//                }

//                await CheckUpdatePolicyAsync();

//                var entityDto = await AppService.GetAsync(entity.Id);

//                EditingEntityId = entity.Id;
//                EditingEntity = MapToEditingEntity(entityDto);

//                await InvokeAsync(async () =>
//                {
//                    StateHasChanged();
//                    if (EditModal != null)
//                    {
//                        await EditModal.Show();
//                    }
//                });
//            }
//            catch (Exception ex)
//            {
//                await HandleErrorAsync(ex);
//            }
//        }

//        protected virtual TUpdateViewModel MapToEditingEntity(TDetailsResult entityDto)
//        {
//            return ObjectMapper.Map<TDetailsResult, TUpdateViewModel>(entityDto);
//        }

//        protected virtual TCreateParameter MapToCreateInput(TCreateViewModel createViewModel)
//        {
//            if (typeof(TCreateParameter) == typeof(TCreateViewModel))
//            {
//                return createViewModel.As<TCreateParameter>();
//            }

//            return ObjectMapper.Map<TCreateViewModel, TCreateParameter>(createViewModel);
//        }

//        protected virtual TUpdateParameter MapToUpdateInput(TUpdateViewModel updateViewModel)
//        {
//            if (typeof(TUpdateParameter) == typeof(TUpdateViewModel))
//            {
//                return updateViewModel.As<TUpdateParameter>();
//            }

//            return ObjectMapper.Map<TUpdateViewModel, TUpdateParameter>(updateViewModel);
//        }

//        protected virtual Task CloseEditModalAsync()
//        {
//            InvokeAsync(EditModal.Hide);
//            return Task.CompletedTask;
//        }

//        protected virtual void ClosingEditModal(ModalClosingEventArgs eventArgs)
//        {
//            // cancel close if clicked outside of modal area
//            eventArgs.Cancel = eventArgs.CloseReason == CloseReason.FocusLostClosing;
//        }

//        protected virtual async Task CreateEntityAsync()
//        {
//            try
//            {
//                var validate = true;
//                if (CreateValidationsRef != null)
//                {
//                    validate = await CreateValidationsRef.ValidateAll();
//                }
//                if (validate)
//                {
//                    await OnCreatingEntityAsync();

//                    await CheckCreatePolicyAsync();
//                    var createInput = MapToCreateInput(NewEntity);
//                    await AppService.CreateAsync(createInput);

//                    await OnCreatedEntityAsync();
//                }
//            }
//            catch (Exception ex)
//            {
//                await HandleErrorAsync(ex);
//            }
//        }

//        protected virtual Task OnCreatingEntityAsync()
//        {
//            return Task.CompletedTask;
//        }

//        protected virtual async Task OnCreatedEntityAsync()
//        {
//            await GetEntitiesAsync();

//            await InvokeAsync(CreateModal.Hide);
//        }

//        protected virtual async Task UpdateEntityAsync()
//        {
//            try
//            {
//                var validate = true;
//                if (EditValidationsRef != null)
//                {
//                    validate = await EditValidationsRef.ValidateAll();
//                }
//                if (validate)
//                {
//                    await OnUpdatingEntityAsync();

//                    await CheckUpdatePolicyAsync();
//                    var updateInput = MapToUpdateInput(EditingEntity);
//                    await AppService.UpdateAsync(EditingEntityId, updateInput);

//                    await OnUpdatedEntityAsync();
//                }
//            }
//            catch (Exception ex)
//            {
//                await HandleErrorAsync(ex);
//            }
//        }

//        protected virtual Task OnUpdatingEntityAsync()
//        {
//            return Task.CompletedTask;
//        }

//        protected virtual async Task OnUpdatedEntityAsync()
//        {
//            await GetEntitiesAsync();

//            await InvokeAsync(EditModal.Hide);
//        }

//        protected virtual async Task DeleteEntityAsync(TListViewModel entity)
//        {
//            try
//            {
//                await CheckDeletePolicyAsync();
//                await OnDeletingEntityAsync();
//                await AppService.DeleteAsync(entity.Id);
//                await OnDeletedEntityAsync();
//            }
//            catch (Exception ex)
//            {
//                await HandleErrorAsync(ex);
//            }
//        }

//        protected virtual Task OnDeletingEntityAsync()
//        {
//            return Task.CompletedTask;
//        }

//        protected virtual async Task OnDeletedEntityAsync()
//        {
//            await GetEntitiesAsync();
//            await InvokeAsync(StateHasChanged);
//            await Notify.Success(L["SuccessfullyDeleted"]);
//        }

//        protected virtual string GetDeleteConfirmationMessage(TListViewModel entity)
//        {
//            return UiLocalizer["ItemWillBeDeletedMessage"];
//        }

//        protected virtual ValueTask SetBreadcrumbItemsAsync()
//        {
//            return ValueTask.CompletedTask;
//        }

//        protected virtual ValueTask SetEntityActionsAsync()
//        {
//            return ValueTask.CompletedTask;
//        }

//        protected virtual ValueTask SetTableColumnsAsync()
//        {
//            return ValueTask.CompletedTask;
//        }

//        protected virtual ValueTask SetToolbarItemsAsync()
//        {
//            return ValueTask.CompletedTask;
//        }

//        protected virtual IEnumerable<TableColumn> GetExtensionTableColumns(string moduleName, string entityType)
//        {
//            var properties = ModuleExtensionConfigurationHelper.GetPropertyConfigurations(moduleName, entityType);
//            foreach (var propertyInfo in properties)
//            {
//                if (propertyInfo.IsAvailableToClients && propertyInfo.UI.OnTable.IsVisible)
//                {
//                    if (propertyInfo.Name.EndsWith("_Text"))
//                    {
//                        var lookupPropertyName = propertyInfo.Name.RemovePostFix("_Text");
//                        var lookupPropertyDefinition = properties.SingleOrDefault(t => t.Name == lookupPropertyName);
//                        yield return new TableColumn
//                        {
//                            Title = lookupPropertyDefinition.GetLocalizedDisplayName(StringLocalizerFactory),
//                            Data = $"ExtraProperties[{propertyInfo.Name}]"
//                        };
//                    }
//                    else
//                    {
//                        var column = new TableColumn
//                        {
//                            Title = propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory),
//                            Data = $"ExtraProperties[{propertyInfo.Name}]"
//                        };

//                        if (propertyInfo.IsDate() || propertyInfo.IsDateTime())
//                        {
//                            column.DisplayFormat = propertyInfo.GetDateEditInputFormatOrNull();
//                        }

//                        if (propertyInfo.Type.IsEnum)
//                        {
//                            column.ValueConverter = (val) =>
//                                EnumHelper.GetLocalizedMemberName(propertyInfo.Type, val.As<ExtensibleObject>().ExtraProperties[propertyInfo.Name], StringLocalizerFactory);
//                        }

//                        yield return column;
//                    }
//                }
//            }
//        }
//    }
//}
